package dominio.neuronio.especializacao;

import java.text.DecimalFormat;

import dominio.ativacao.FuncaoAtivacao;
import dominio.neuronio.NeuronioAbstrato;
import dominio.neuronio.Sinapse;
import dominio.padrao.Padrao;

/**
 * @author Paulo Vitor
 * @author Roberto Su
 * 
 * @description
 *
 *
 */
public class NeuronioGenerico extends NeuronioAbstrato {
	
	/**
	 * 
	 */
	public NeuronioGenerico(){
		super();
	}
	
	/**
	 * 
	 * @param funcaoAtivacao
	 */
	public NeuronioGenerico( FuncaoAtivacao funcaoAtivacao ) {
		// 
		super( funcaoAtivacao );
	}
	
	/*
	 * (non-Javadoc)
	 * @see dominio.NeuronioAbstrato#estimular(int[])
	 */
	public double estimular( Padrao padrao ) {

		// gera as sinapses à partir das entradas
		this.criarSinapses( padrao );

		// processa a soma das saídas das sinapses
		this.entradaLiquida = this.totalizarEntradaLiquida();
		
		// aplica a função de ativação
		this.saida = this.funcaoAtivacao.aplicarFuncaoAtivacao( this.entradaLiquida );

		// retorna y
		return this.saida;
	}

	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		DecimalFormat formatter = new DecimalFormat( "0.0000" );
		formatter.setPositivePrefix( " " );

		StringBuffer buf = new StringBuffer();
		buf.append( "\t# Neuronio Generico\n" );

		// sinapses
		buf.append( "\t\tSinapses: \n" );
		if ( this.sinapses != null && this.sinapses.size() > 0 ) {
			for( Sinapse sinapse : this.sinapses ) {
				buf.append( "\t\t\t" ).append( sinapse.toString() ).append( "\n" );
			}
		}

		// entrada líquida
		buf.append( "\n\t\tEntrada liquida: " ).append( formatter.format( this.entradaLiquida ) ).append( "\n" );

		// função de ativação
		buf.append( "\t\tFuncao de ativacao: " );
		buf.append( this.funcaoAtivacao != null ? this.funcaoAtivacao.toString() : null ).append( "\n" );

		// saida
		buf.append( "\t\tSaida: " ).append( formatter.format( this.saida ) ).append( "\n\n" );

		return buf.toString();
	}

}
